import 'dart:io';
import 'package:flutter/foundation.dart';
import '../../directory_cache_service.dart';

/// 目录路径解析器，用于解析文件路径并创建相应的目录结构
class DirectoryPathParser {
  final DirectoryCacheService _directoryCacheService = DirectoryCacheService();

  /// 解析文件路径并创建目录结构，返回最终的目录ID
  Future<int> parseAndCreateDirectory(
    String filePath,
    String deviceName,
  ) async {
    try {
      debugPrint('开始解析并创建目录，文件路径: $filePath, 设备名: $deviceName');

      // 检查设备名是否为空
      if (deviceName.trim().isEmpty) {
        debugPrint('警告: 设备名称为空，将使用默认设备名');
        deviceName = Platform.isAndroid ? 'Android设备' : 'iOS设备';
      }

      // 获取目录结构数组
      final directoryStructure = parseFilePathForDirectoryStructure(
        filePath,
        deviceName,
      );

      // 如果目录结构为空，返回根目录
      if (directoryStructure.isEmpty) {
        debugPrint('目录结构解析为空，返回根目录ID (0)');
        return 0;
      }

      debugPrint('将创建以下目录结构: $directoryStructure');

      // 创建目录结构并返回最终目录ID
      final directoryId = await createDirectoryStructure(directoryStructure);
      debugPrint('目录创建完成，最终目录ID: $directoryId');
      return directoryId;
    } catch (e) {
      debugPrint('解析并创建目录结构失败: $e');
      return 0; // 失败时返回根目录
    }
  }

  /// 解析文件路径获取目录结构
  /// 例如：/storage/emulated/0/DCIM/Camera/image.jpg 将解析为 ['设备名', 'DCIM', 'Camera']
  List<String> parseFilePathForDirectoryStructure(
    String filePath,
    String deviceName,
  ) {
    try {
      debugPrint('解析文件路径: $filePath');

      // 标准化路径分隔符
      final normalizedPath = filePath.replaceAll('\\', '/');
      debugPrint('分割后的路径部分: $normalizedPath');

      // 分割路径
      final parts = normalizedPath.split('/');

      // 创建目录结构数组
      final List<String> directoryStructure = [];

      // 设备名称作为第一级目录
      directoryStructure.add(
        deviceName.isNotEmpty
            ? deviceName
            : (Platform.isAndroid ? 'Android设备' : 'iOS设备'),
      );

      // 提取关键路径部分
      for (int i = 0; i < parts.length - 1; i++) {
        final part = parts[i];

        // 跳过空部分和常见的存储路径前缀
        if (part.isEmpty ||
            part == 'storage' ||
            part == 'emulated' ||
            part == '0' ||
            part == 'data' ||
            part == 'media') {
          continue;
        }

        // 添加有意义的目录部分
        if ([
              'DCIM',
              'Pictures',
              'Camera',
              'Screenshots',
              'Download',
            ].contains(part) ||
            !['Android', 'iOS'].contains(part)) {
          directoryStructure.add(part);
        }
      }

      debugPrint('解析的目录结构: $directoryStructure');
      return directoryStructure;
    } catch (e) {
      debugPrint('解析文件路径失败: $e');
      return [deviceName]; // 失败时至少返回设备名作为目录
    }
  }

  /// 创建目录结构并返回最终目录ID
  Future<int> createDirectoryStructure(List<String> directoryStructure) async {
    if (directoryStructure.isEmpty) {
      debugPrint('目录结构为空，返回根目录ID (0)');
      return 0; // 根目录
    }

    try {
      int directoryId = 0; // 从根目录开始
      String deviceName = directoryStructure[0]; // 第一级目录是设备名

      // 确保设备目录存在
      debugPrint('创建设备目录: $deviceName');
      directoryId = await _directoryCacheService.getOrCreateDeviceDirectory(
        deviceName,
      );
      debugPrint('设备目录ID: $directoryId');

      // 如果只有设备名一级目录，直接返回
      if (directoryStructure.length == 1) {
        debugPrint('只有设备名目录，返回设备目录ID: $directoryId');
        return directoryId;
      }

      // 处理二级目录（如DCIM）
      String secondLevelDirName = directoryStructure[1];
      debugPrint('创建二级目录: $secondLevelDirName (设备: $deviceName)');
      directoryId = await _directoryCacheService.getOrCreateAlbumDirectory(
        deviceName,
        secondLevelDirName,
      );
      debugPrint('二级目录ID: $directoryId');

      // 处理更深层次的目录结构（如Camera等）
      for (int i = 2; i < directoryStructure.length; i++) {
        final parentAlbumName = directoryStructure[i - 1];
        final albumName = directoryStructure[i];

        debugPrint('创建子目录: $albumName (父目录: $parentAlbumName)');
        directoryId = await _directoryCacheService.getOrCreateSubAlbumDirectory(
          deviceName,
          parentAlbumName,
          albumName,
        );
        debugPrint('子目录ID: $directoryId');
      }

      debugPrint('创建目录结构完成，最终目录ID: $directoryId');
      return directoryId;
    } catch (e) {
      debugPrint('创建目录结构失败: $e');
      return 0; // 失败时返回根目录ID
    }
  }
}
